//package org.jeecg.modules.system.controller;
//
//import com.alibaba.fastjson.JSONObject;
//import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
//import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
//import lombok.extern.slf4j.Slf4j;
//import org.apache.commons.lang3.StringUtils;
//import org.apache.shiro.SecurityUtils;
//import org.apache.shiro.authz.annotation.RequiresRoles;
//import org.jeecg.common.api.vo.Result;
//import org.jeecg.common.constant.CacheConstant;
//import org.jeecg.common.constant.CommonConstant;
//import org.jeecg.common.system.query.QueryGenerator;
//import org.jeecg.common.system.util.JwtUtil;
//import org.jeecg.common.system.vo.LoginUser;
//import org.jeecg.common.util.ImportExcelUtil;
//import org.jeecg.common.util.YouBianCodeUtil;
//import org.jeecg.common.util.oConvertUtils;
//import org.jeecg.modules.system.entity.SysDepart;
//import org.jeecg.modules.system.entity.SysUser;
//import org.jeecg.modules.system.model.DepartIdModel;
//import org.jeecg.modules.system.model.SysDepartTreeModel;
//import org.jeecg.modules.system.service.ISysDepartService;
//import org.jeecg.modules.system.service.ISysUserDepartService;
//import org.jeecg.modules.system.service.ISysUserService;
//import org.jeecgframework.poi.excel.ExcelImportUtil;
//import org.jeecgframework.poi.excel.def.NormalExcelConstants;
//import org.jeecgframework.poi.excel.entity.ExportParams;
//import org.jeecgframework.poi.excel.entity.ImportParams;
//import org.jeecgframework.poi.excel.view.JeecgEntityExcelView;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.cache.annotation.CacheEvict;
//import org.springframework.data.redis.core.RedisTemplate;
//import org.springframework.web.bind.annotation.*;
//import org.springframework.web.multipart.MultipartFile;
//import org.springframework.web.multipart.MultipartHttpServletRequest;
//import org.springframework.web.servlet.ModelAndView;
//
//import javax.servlet.http.HttpServletRequest;
//import javax.servlet.http.HttpServletResponse;
//import java.io.IOException;
//import java.util.*;
//
///**
// * <p>
// * 部门表 前端控制器
// * <p>
// *
// * @Author: Steve @Since： 2019-01-22
// */
//@RestController
//@RequestMapping("/sys/sysDepart")
//@Slf4j
//public class SysDepartController {
//
//	@Autowired
//	private ISysDepartService sysDepartService;
//	@Autowired
//	public RedisTemplate<String, Object> redisTemplate;
//	@Autowired
//	private ISysUserService sysUserService;
//	@Autowired
//	private ISysUserDepartService sysUserDepartService;
//	/**
//	 * 查询数据 查出我的部门,并以树结构数据格式响应给前端
//	 *
//	 * @return
//	 */
//	@RequestMapping(value = "/queryMyDeptTreeList", method = RequestMethod.GET)
//	public Result<List<SysDepartTreeModel>> queryMyDeptTreeList() {
//		Result<List<SysDepartTreeModel>> result = new Result<>();
//		LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal();
//		try {
//			if(oConvertUtils.isNotEmpty(user.getUserIdentity()) && user.getUserIdentity().equals( CommonConstant.USER_IDENTITY_2 )){
//				//update-begin--Author:liusq  Date:20210624  for:部门查询ids为空后的前端显示问题 issues/I3UD06
////				String departIds = user.getDepartIds();
////				if(StringUtils.isNotBlank(departIds)){
////					List<SysDepartTreeModel> list = sysDepartService.queryMyDeptTreeList(departIds);
////					result.setResult(list);
////				}
////				//update-end--Author:liusq  Date:20210624  for:部门查询ids为空后的前端显示问题 issues/I3UD06
////				result.setMessage(CommonConstant.USER_IDENTITY_2.toString());
////				result.setSuccess(true);
//			}else{
//				result.setMessage(CommonConstant.USER_IDENTITY_1.toString());
//				result.setSuccess(true);
//			}
//		} catch (Exception e) {
//			log.error(e.getMessage(),e);
//		}
//		return result;
//	}
//
//	/**
//	 * 查询数据 查出所有部门,并以树结构数据格式响应给前端
//	 *
//	 * @return
//	 */
//	@RequestMapping(value = "/queryTreeList", method = RequestMethod.GET)
//	public Result<List<SysDepartTreeModel>> queryTreeList() {
//		Result<List<SysDepartTreeModel>> result = new Result<>();
//		try {
//			// 从内存中读取
////			List<SysDepartTreeModel> list =FindsDepartsChildrenUtil.getSysDepartTreeList();
////			if (CollectionUtils.isEmpty(list)) {
////				list = sysDepartService.queryTreeList();
////			}
//			List<SysDepartTreeModel> list = sysDepartService.queryTreeList();
//			result.setResult(list);
//			result.setSuccess(true);
//		} catch (Exception e) {
//			log.error(e.getMessage(),e);
//		}
//		return result;
//	}
//
//	/**
//	 * 异步查询部门list
//	 *
//	 * @return
//	 */
//	@RequestMapping(value = "/queryDepartTreeSync", method = RequestMethod.GET)
//	public Result<List<SysDepartTreeModel>> queryDepartTreeSync(@RequestParam(name = "pid", required = false) String parentId) {
//		Result<List<SysDepartTreeModel>> result = new Result<>();
//		try {
//			List<SysDepartTreeModel> list = sysDepartService.queryTreeListByPid(parentId);
//			result.setResult(list);
//			result.setSuccess(true);
//		} catch (Exception e) {
//			log.error(e.getMessage(),e);
//		}
//		return result;
//	}
//
//	/**
//	 * 获取某个部门的所有父级部门的ID
//	 *
//	 * @param departId 根据departId查
//	 * @param orgCode  根据orgCode查，departId和orgCode必须有一个不为空
//	 */
//	@GetMapping("/queryAllParentId")
//	public Result queryParentIds(
//			@RequestParam(name = "departId", required = false) String departId,
//			@RequestParam(name = "orgCode", required = false) String orgCode
//	) {
//		try {
//			JSONObject data;
//			if (oConvertUtils.isNotEmpty(departId)) {
//				data = sysDepartService.queryAllParentIdByDepartId(departId);
//			} else if (oConvertUtils.isNotEmpty(orgCode)) {
//				data = sysDepartService.queryAllParentIdByOrgCode(orgCode);
//			} else {
//				return Result.error("departId 和 orgCode 不能都为空！");
//			}
//			return Result.OK(data);
//		} catch (Exception e) {
//			log.error(e.getMessage(), e);
//			return Result.error(e.getMessage());
//		}
//	}
//
//	/**
//	 * 添加新数据 添加用户新建的部门对象数据,并保存到数据库
//	 *
//	 * @param sysDepart
//	 * @return
//	 */
//	//@RequiresRoles({"admin"})
//	@RequestMapping(value = "/add", method = RequestMethod.POST)
//	@CacheEvict(value= {CacheConstant.SYS_DEPARTS_CACHE,CacheConstant.SYS_DEPART_IDS_CACHE}, allEntries=true)
//	public Result<SysDepart> add(@RequestBody SysDepart sysDepart, HttpServletRequest request) {
//		Result<SysDepart> result = new Result<SysDepart>();
//		String username = JwtUtil.getUserNameByToken(request);
//		try {
//			sysDepart.setCreateBy(username);
//			sysDepartService.saveDepartData(sysDepart, username);
//			//清除部门树内存
//			// FindsDepartsChildrenUtil.clearSysDepartTreeList();
//			// FindsDepartsChildrenUtil.clearDepartIdModel();
//			result.success("添加成功！");
//		} catch (Exception e) {
//			log.error(e.getMessage(),e);
//			result.error500("操作失败");
//		}
//		return result;
//	}
//
//	/**
//	 * 编辑数据 编辑部门的部分数据,并保存到数据库
//	 *
//	 * @param sysDepart
//	 * @return
//	 */
//	//@RequiresRoles({"admin"})
//	@RequestMapping(value = "/edit", method = RequestMethod.PUT)
//	@CacheEvict(value= {CacheConstant.SYS_DEPARTS_CACHE,CacheConstant.SYS_DEPART_IDS_CACHE}, allEntries=true)
//	public Result<SysDepart> edit(@RequestBody SysDepart sysDepart, HttpServletRequest request) {
//		String username = JwtUtil.getUserNameByToken(request);
//		sysDepart.setUpdateBy(username);
//		Result<SysDepart> result = new Result<SysDepart>();
//		SysDepart sysDepartEntity = sysDepartService.getById(sysDepart.getId());
//		if (sysDepartEntity == null) {
//			result.error500("未找到对应实体");
//		} else {
//			boolean ok = sysDepartService.updateDepartDataById(sysDepart, username);
//			// TODO 返回false说明什么？
//			if (ok) {
//				//清除部门树内存
//				//FindsDepartsChildrenUtil.clearSysDepartTreeList();
//				//FindsDepartsChildrenUtil.clearDepartIdModel();
//				result.success("修改成功!");
//			}
//		}
//		return result;
//	}
//
//	 /**
//     *   通过id删除
//    * @param id
//    * @return
//    */
//	//@RequiresRoles({"admin"})
//    @RequestMapping(value = "/delete", method = RequestMethod.DELETE)
//	@CacheEvict(value= {CacheConstant.SYS_DEPARTS_CACHE,CacheConstant.SYS_DEPART_IDS_CACHE}, allEntries=true)
//   public Result<SysDepart> delete(@RequestParam(name="id",required=true) String id) {
//
//       Result<SysDepart> result = new Result<SysDepart>();
//       SysDepart sysDepart = sysDepartService.getById(id);
//       if(sysDepart==null) {
//           result.error500("未找到对应实体");
//       }else {
//           boolean ok = sysDepartService.delete(id);
//           if(ok) {
//	            //清除部门树内存
//	   		   //FindsDepartsChildrenUtil.clearSysDepartTreeList();
//	   		   // FindsDepartsChildrenUtil.clearDepartIdModel();
//               result.success("删除成功!");
//           }
//       }
//       return result;
//   }
//
//
//	/**
//	 * 批量删除 根据前端请求的多个ID,对数据库执行删除相关部门数据的操作
//	 *
//	 * @param ids
//	 * @return
//	 */
//	//@RequiresRoles({"admin"})
//	@RequestMapping(value = "/deleteBatch", method = RequestMethod.DELETE)
//	@CacheEvict(value= {CacheConstant.SYS_DEPARTS_CACHE,CacheConstant.SYS_DEPART_IDS_CACHE}, allEntries=true)
//	public Result<SysDepart> deleteBatch(@RequestParam(name = "ids", required = true) String ids) {
//
//		Result<SysDepart> result = new Result<SysDepart>();
//		if (ids == null || "".equals(ids.trim())) {
//			result.error500("参数不识别！");
//		} else {
//			this.sysDepartService.deleteBatchWithChildren(Arrays.asList(ids.split(",")));
//			result.success("删除成功!");
//		}
//		return result;
//	}
//
//	/**
//	 * 查询数据 添加或编辑页面对该方法发起请求,以树结构形式加载所有部门的名称,方便用户的操作
//	 *
//	 * @return
//	 */
//	@RequestMapping(value = "/queryIdTree", method = RequestMethod.GET)
//	public Result<List<DepartIdModel>> queryIdTree() {
////		Result<List<DepartIdModel>> result = new Result<List<DepartIdModel>>();
////		List<DepartIdModel> idList;
////		try {
////			idList = FindsDepartsChildrenUtil.wrapDepartIdModel();
////			if (idList != null && idList.size() > 0) {
////				result.setResult(idList);
////				result.setSuccess(true);
////			} else {
////				sysDepartService.queryTreeList();
////				idList = FindsDepartsChildrenUtil.wrapDepartIdModel();
////				result.setResult(idList);
////				result.setSuccess(true);
////			}
////			return result;
////		} catch (Exception e) {
////			log.error(e.getMessage(),e);
////			result.setSuccess(false);
////			return result;
////		}
//		Result<List<DepartIdModel>> result = new Result<>();
//		try {
//			List<DepartIdModel> list = sysDepartService.queryDepartIdTreeList();
//			result.setResult(list);
//			result.setSuccess(true);
//		} catch (Exception e) {
//			log.error(e.getMessage(),e);
//		}
//		return result;
//	}
//
//	/**
//	 * <p>
//	 * 部门搜索功能方法,根据关键字模糊搜索相关部门
//	 * </p>
//	 *
//	 * @param keyWord
//	 * @return
//	 */
//	@RequestMapping(value = "/searchBy", method = RequestMethod.GET)
//	public Result<List<SysDepartTreeModel>> searchBy(@RequestParam(name = "keyWord", required = true) String keyWord,@RequestParam(name = "myDeptSearch", required = false) String myDeptSearch) {
//		Result<List<SysDepartTreeModel>> result = new Result<List<SysDepartTreeModel>>();
//		//部门查询，myDeptSearch为1时为我的部门查询，登录用户为上级时查只查负责部门下数据
//		LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal();
//		String departIds = null;
////		if(oConvertUtils.isNotEmpty(user.getUserIdentity()) && user.getUserIdentity().equals( CommonConstant.USER_IDENTITY_2 )){
////			departIds = user.getDepartIds();
////		}
//		List<SysDepartTreeModel> treeList = this.sysDepartService.searhBy(keyWord,myDeptSearch,departIds);
//		if (treeList == null || treeList.size() == 0) {
//			result.setSuccess(false);
//			result.setMessage("未查询匹配数据！");
//			return result;
//		}
//		result.setResult(treeList);
//		return result;
//	}
//
//
//	/**
//     * 导出excel
//     *
//     * @param request
//     */
//    @RequestMapping(value = "/exportXls")
//    public ModelAndView exportXls(SysDepart sysDepart,HttpServletRequest request) {
//        // Step.1 组装查询条件
//        QueryWrapper<SysDepart> queryWrapper = QueryGenerator.initQueryWrapper(sysDepart, request.getParameterMap());
//        //Step.2 AutoPoi 导出Excel
//        ModelAndView mv = new ModelAndView(new JeecgEntityExcelView());
//        List<SysDepart> pageList = sysDepartService.list(queryWrapper);
//        //按字典排序
//        Collections.sort(pageList, new Comparator<SysDepart>() {
//            @Override
//			public int compare(SysDepart arg0, SysDepart arg1) {
//            	return arg0.getOrgCode().compareTo(arg1.getOrgCode());
//            }
//        });
//        //导出文件名称
//        mv.addObject(NormalExcelConstants.FILE_NAME, "部门列表");
//        mv.addObject(NormalExcelConstants.CLASS, SysDepart.class);
//        LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal();
//        mv.addObject(NormalExcelConstants.PARAMS, new ExportParams("部门列表数据", "导出人:"+user.getRealname(), "导出信息"));
//        mv.addObject(NormalExcelConstants.DATA_LIST, pageList);
//        return mv;
//    }
//
//    /**
//     * 通过excel导入数据
//     *
//     * @param request
//     * @param response
//     * @return
//     */
//    //@RequiresRoles({"admin"})
//    @RequestMapping(value = "/importExcel", method = RequestMethod.POST)
//	@CacheEvict(value= {CacheConstant.SYS_DEPARTS_CACHE,CacheConstant.SYS_DEPART_IDS_CACHE}, allEntries=true)
//    public Result<?> importExcel(HttpServletRequest request, HttpServletResponse response) {
//        MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
//		List<String> errorMessageList = new ArrayList<>();
//		List<SysDepart> listSysDeparts = null;
//        Map<String, MultipartFile> fileMap = multipartRequest.getFileMap();
//        for (Map.Entry<String, MultipartFile> entity : fileMap.entrySet()) {
//            MultipartFile file = entity.getValue();// 获取上传文件对象
//            ImportParams params = new ImportParams();
//            params.setTitleRows(2);
//            params.setHeadRows(1);
//            params.setNeedSave(true);
//            try {
//            	// orgCode编码长度
//            	int codeLength = YouBianCodeUtil.zhanweiLength;
//                listSysDeparts = ExcelImportUtil.importExcel(file.getInputStream(), SysDepart.class, params);
//                //按长度排序
//                Collections.sort(listSysDeparts, new Comparator<SysDepart>() {
//                    @Override
//					public int compare(SysDepart arg0, SysDepart arg1) {
//                    	return arg0.getOrgCode().length() - arg1.getOrgCode().length();
//                    }
//                });
//
//                int num = 0;
//                for (SysDepart sysDepart : listSysDeparts) {
//                	String orgCode = sysDepart.getOrgCode();
//                	if(orgCode.length() > codeLength) {
//                		String parentCode = orgCode.substring(0, orgCode.length()-codeLength);
//                		QueryWrapper<SysDepart> queryWrapper = new QueryWrapper<SysDepart>();
//                		queryWrapper.eq("org_code", parentCode);
//                		try {
//                		SysDepart parentDept = sysDepartService.getOne(queryWrapper);
//                		if(!parentDept.equals(null)) {
//							sysDepart.setParentId(parentDept.getId());
//						} else {
//							sysDepart.setParentId("");
//						}
//                		}catch (Exception e) {
//                			//没有查找到parentDept
//                		}
//                	}else{
//                		sysDepart.setParentId("");
//					}
//                    //update-begin---author:liusq   Date:20210223  for：批量导入部门以后，不能追加下一级部门 #2245------------
//					sysDepart.setOrgType(sysDepart.getOrgCode().length()/codeLength+"");
//                    //update-end---author:liusq   Date:20210223  for：批量导入部门以后，不能追加下一级部门 #2245------------
//					sysDepart.setDelFlag(CommonConstant.DEL_FLAG_0.toString());
//					ImportExcelUtil.importDateSaveOne(sysDepart, ISysDepartService.class, errorMessageList, num, CommonConstant.SQL_INDEX_UNIQ_DEPART_ORG_CODE);
//					num++;
//                }
//				//清空部门缓存
//				Set keys3 = redisTemplate.keys(CacheConstant.SYS_DEPARTS_CACHE + "*");
//				Set keys4 = redisTemplate.keys(CacheConstant.SYS_DEPART_IDS_CACHE + "*");
//				redisTemplate.delete(keys3);
//				redisTemplate.delete(keys4);
//				return ImportExcelUtil.imporReturnRes(errorMessageList.size(), listSysDeparts.size() - errorMessageList.size(), errorMessageList);
//            } catch (Exception e) {
//                log.error(e.getMessage(),e);
//                return Result.error("文件导入失败:"+e.getMessage());
//            } finally {
//                try {
//                    file.getInputStream().close();
//                } catch (IOException e) {
//                    e.printStackTrace();
//                }
//            }
//        }
//        return Result.error("文件导入失败！");
//    }
//
//
//	/**
//	 * 查询所有部门信息
//	 * @return
//	 */
//	@GetMapping("listAll")
//	public Result<List<SysDepart>> listAll(@RequestParam(name = "id", required = false) String id) {
//		Result<List<SysDepart>> result = new Result<>();
//		LambdaQueryWrapper<SysDepart> query = new LambdaQueryWrapper<SysDepart>();
//		query.orderByAsc(SysDepart::getOrgCode);
//		if(oConvertUtils.isNotEmpty(id)){
//			String arr[] = id.split(",");
//			query.in(SysDepart::getId,arr);
//		}
//		List<SysDepart> ls = this.sysDepartService.list(query);
//		result.setSuccess(true);
//		result.setResult(ls);
//		return result;
//	}
//	/**
//	 * 查询数据 查出所有部门,并以树结构数据格式响应给前端
//	 *
//	 * @return
//	 */
//	@RequestMapping(value = "/queryTreeByKeyWord", method = RequestMethod.GET)
//	public Result<Map<String,Object>> queryTreeByKeyWord(@RequestParam(name = "keyWord", required = false) String keyWord) {
//		Result<Map<String,Object>> result = new Result<>();
//		try {
//			Map<String,Object> map=new HashMap<String,Object>();
//			List<SysDepartTreeModel> list = sysDepartService.queryTreeByKeyWord(keyWord);
//			//根据keyWord获取用户信息
//			LambdaQueryWrapper<SysUser> queryUser = new LambdaQueryWrapper<SysUser>();
//			queryUser.eq(SysUser::getDelFlag,CommonConstant.DEL_FLAG_0);
//			queryUser.and(i -> i.like(SysUser::getUsername, keyWord).or().like(SysUser::getRealname, keyWord));
//			List<SysUser> sysUsers = this.sysUserService.list(queryUser);
//			map.put("userList",sysUsers);
//			map.put("departList",list);
//			result.setResult(map);
//			result.setSuccess(true);
//		} catch (Exception e) {
//			log.error(e.getMessage(),e);
//		}
//		return result;
//	}
//
//	/**
//	 * 根据部门编码获取部门信息
//	 *
//	 * @param orgCode
//	 * @return
//	 */
//	@GetMapping("/getDepartName")
//	public Result<SysDepart> getDepartName(@RequestParam(name = "orgCode") String orgCode) {
//		Result<SysDepart> result = new Result<>();
//		LambdaQueryWrapper<SysDepart> query = new LambdaQueryWrapper<>();
//		query.eq(SysDepart::getOrgCode, orgCode);
//		SysDepart sysDepart = sysDepartService.getOne(query);
//		result.setSuccess(true);
//		result.setResult(sysDepart);
//		return result;
//	}
//
//	/**
//	 * 根据部门id获取用户信息
//	 *
//	 * @param id
//	 * @return
//	 */
//	@GetMapping("/getUsersByDepartId")
//	public Result<List<SysUser>> getUsersByDepartId(@RequestParam(name = "id") String id) {
//		Result<List<SysUser>> result = new Result<>();
//		List<SysUser> sysUsers = sysUserDepartService.queryUserByDepId(id);
//		result.setSuccess(true);
//		result.setResult(sysUsers);
//		return result;
//	}
//}
